<?php
/**
* [LupMisAllowedSync]
* ServiceImpl: TestOrderServiceImpl
* 本代码为系统自动生成代码，请根据自己业务进行修改;
* 生成时间 2022-04-13 10:14:18;
* 版权所有 2020-2022 lizhongwen，并保留所有权利;
* 说明: 这不是一个自由软件！您只能在不用于商业目的的前提下对程序代码进行修改和使用；不允许对程序代码以任何形式任何目的的再发布;
* 作者: 中文Lee;
* 作者主页: http://www.lizhongwen.com;
* 邮箱: 360811363@qq.com;
* QQ: 360811363;
*/
namespace modules\lup\service\impl;

use application\core\SnowFlake;
use modules\lup\mapper\TestOrderMapper;
use modules\lup\service\TestOrderService;
use Exception;
use modules\lup\mapper\TestUserMapper;
use modules\lup\mapper\TestAgentMapper;
use application\component\DataComponent;

class TestOrderServiceImpl implements TestOrderService
{
    /**
     * TestOrder数据列表
     * @param array $data
     * @param array $pagePars
     * @return array
     */
    function lists(array $data = [], array $pagePars = []): array
    {
        $lists = TestOrderMapper::lists($data, $pagePars);
        $rows = $lists['rows'] ?? $lists;
        //首先判断是否有数据，如果没有数据则直接返回
        if (empty($rows)) {
            return $lists;
        } 
        $userIdsArray = [];
        $agentIdsArray = [];
        //取出数据库对应关系的字段的值（这里用逗号隔开）
        foreach ($rows as $v) {
            $userIdsArray[] = $v['user_id'];
            $agentIdsArray[] = $v['agent_id'];
        }
        //将数据表testUser中根据id字段取出符合符合条件的数据，并以id作为主键
        $testUserRes = array_column(TestUserMapper::listsIn(['ids' => implode(',', $userIdsArray)]), NULL, 'id');
        //将数据表testAgent中根据id字段取出符合符合条件的数据，并以id作为主键
        $testAgentRes = array_column(TestAgentMapper::listsIn(['ids' => implode(',', $agentIdsArray)]), NULL, 'id');
        //根据上面取出的符合条件的数据开始绑定映射关系
        foreach ($rows as $k => $v) {
            $rows[$k]['order_type_res'] = DataComponent::getDictData($v['order_type'], 'test_order:type');
            $rows[$k]['user_id_res'] = DataComponent::getDbField($v['user_id'], $testUserRes);
            $rows[$k]['order_tags_res'] = DataComponent::getDictData($v['order_tags'], 'order:tags');
            $rows[$k]['goods_type_res'] = DataComponent::getCatalog($v['goods_type']);
            $rows[$k]['agent_id_res'] = DataComponent::getDbField($v['agent_id'], $testAgentRes);
        }

        isset($lists['rows']) ? ($lists['rows'] = $rows) : ($lists = $rows);
        return $lists;
    }

    /**
     * TestOrder数据单条查询
     * @param array $data
     * @return array
     */
    function query(array $data): array
    {
        $query = TestOrderMapper::query($data);
        //将数据表testUser中根据id字段取出符合符合条件的数据，并以id作为主键
        $testUserRes = array_column(TestUserMapper::listsIn(['ids' => $query['user_id']]), NULL, 'id');
        //将数据表testAgent中根据id字段取出符合符合条件的数据，并以id作为主键
        $testAgentRes = array_column(TestAgentMapper::listsIn(['ids' => $query['agent_id']]), NULL, 'id');
        //根据上面取出的符合条件的数据开始绑定映射关系
        $query['order_type_res'] = DataComponent::getDictData($query['order_type'], 'test_order:type');
        $query['user_id_res'] = DataComponent::getDbField($query['user_id'], $testUserRes);
        $query['order_tags_res'] = DataComponent::getDictData($query['order_tags'], 'order:tags');
        $query['goods_type_res'] = DataComponent::getCatalog($query['goods_type']);
        $query['agent_id_res'] = DataComponent::getDbField($query['agent_id'], $testAgentRes);

        return $query;
    }

    /**
     * TestOrder添加
     * @param array $data
     * @return int
     */
    public function add(array $data): int
    {
        $data['id'] = $data['id'] ?? SnowFlake::instance()->nextId();
        $data['create_time'] = $data['create_time'] ?? date('Y-m-d H:i:s');
        return TestOrderMapper::add($data);
    }

    /**
     * TestOrder修改
     * @param array $data
     * @return int
     */
    public function edit(array $data): int
    {
        return TestOrderMapper::edit($data);
    }

    /**
     * TestOrder删除
     * @param array $data
     * @return int
     * @throws \Exception
     */
    public function del(array $data): int
    {
        $ids = $data['ids'];
        if (empty($ids)) {
            throw new Exception("请至少选择一条数据");
        }
        $delNum = 0;
        $idsArr = explode(",", $ids);
        foreach ($idsArr as $id) {
            $delNum += TestOrderMapper::del(['id' => $id]);
        }
        return $delNum;
    }
}